package 每日一题;

import java.util.Collections;
import java.util.List;

/**
 * @author 会玩的洋洋
 * @since 2022/1/18
 * https://leetcode-cn.com/problems/minimum-time-difference/
 */
public class _539_最小时间差 {

    /**
     * 通过鸽巢原理  一共有24×60=1440种不同的时间，因此可以判断如果长度大于1440
     * 则一定有重复的  则最小差一定为0  通过此先觉条件 可以排除一部分内容
     * 再通过排序进行查找 最小差
     * @param timePoints 目标时间数组
     * @return int
     */
    public int findMinDifference(List<String> timePoints) {
        int n = timePoints.size();
        // 鸽巢原理
        if (n > 1440) {
            return 0;
        }

        // 排序
        Collections.sort(timePoints);
        int ans = Integer.MAX_VALUE;
        int minutes0 = getMinutes(timePoints.get(0));
        int preMinutes = minutes0;

        // 遍历查询最小值
        for (int i = 1; i < n; i++) {
            int minutes = getMinutes(timePoints.get(i));
            // 相邻两个比较  计算最小差
            ans = Math.min(ans, minutes - preMinutes);
            preMinutes = minutes;
        }
        // 将首位两个进行比较  查看最小差
        ans = Math.min(ans, minutes0 + 1440 - preMinutes);
        return ans;
    }

    /**
     * 将字符串转换成为整数分钟
     * @param t 目标字符串
     * @return int
     */
    public int getMinutes(String t) {
        return ((t.charAt(0) - '0') * 10 + (t.charAt(1) - '0')) * 60 + (t.charAt(3) - '0') * 10 + (t.charAt(4) - '0');
    }
}
